16-2 O

MATLAB 支援二種條件指令(Branching Command,或中譯成「分支指令」),一種是 if-then-else 條件指令,另一種是 MATLAB 在第五版之後開始支援的 switch - case - otherwise 條件指令,以下分述之。

最常用的條件指令是 if - then - else,其使用語法為:

if 條件式 運算式一; else 運算式二; end

當條件式成立時,MATLAB 將執行運算式一,否則,就執行運算式二。若不需使用運算式二,則可直接省略 else 和運算式二。例如:在數值運算的過程中,若變數值為 NaN(即 Not A Number )時,我們要立刻印出警告訊息,可輸入如下:

Example 1: 16-程式流程控制/if01.mx = 0/0; if isnan(x) disp('Warning: NaN detected!'); endWarning: NaN detected!

在上例中,isnan(x) 可用於判斷 x 是否為 NaN,若是,則傳回 1(真),否則即傳回 0(偽)。

在下例中,我們可根據向量 y 的元素值為奇數或偶數,來顯示不同的訊息:

Example 2: 16-程式流程控制/if02.my = [0 3 4 1 6]; for i = 1:length(y) if rem(y(i), 2)==0 fprintf('y(%g) = %g is even.\n', i, y(i)); else fprintf('y(%g) = %g is odd.\n', i, y(i)); end endy(1) = 0 is even. y(2) = 3 is odd. y(3) = 4 is even. y(4) = 1 is odd. y(5) = 6 is even.

上述的 if - then - else 為雙向條件,亦即程式只會執行「運算式一」或「運算式 二」,不會有第三種可能。

MATLAB 亦可執行多向條件,其使用語法為:

if 條件式一 運算式一; elseif 條件式二 運算式二; elseif 條件式三 運算式三; else 運算式四; end

可見若要進行更多向的條件,只需一再重覆 elseif 即可。例如,欲判斷 y 向量之元素是屬於 3n、3n+1、 或 3n+2,可輸入如下:

Example 3: 16-程式流程控制/if03.my = [3 4 5 9 2]; for i = 1:length(y) if rem(y(i),3)==0 fprintf('y(%g)=%g is 3n.\n', i, y(i)); elseif rem(y(i), 3)==1 fprintf('y(%g)=%g is 3n+1.\n', i , y(i)); else fprintf('y(%g)=%g is 3n+2.\n', i , y(i)); end endy(1)=3 is 3n. y(2)=4 is 3n+1. y(3)=5 is 3n+2. y(4)=9 is 3n. y(5)=2 is 3n+2.

我們也可以使用矩陣於條件式中,此時必需在矩陣元素皆不為零時,條件式才算成立。換句話說:「if x, expression; end」完全等效於「if all(x(:)), expression; end」。但是必需注意的是:當 x 是空矩陣時,條件式將永遠不成立。

MATLAB 也支援 switch-case-otherwise 的多向條件指令,其使用語法如下:

switch expression case value(1) statement(1) case value(2) statement(2) ... case value(n-1) statement(n-1) otherwise statement(n) end

在上述語法中,expression 為一數值或字串,當其值和 value(k) 相等時,MATLAB 即執行 statement(k) 並跳出 switch 指令。若 expression 不等於 value(k),k=1, 2, …, n-1,則 MATLAB 會執行 statement(n) 並跳出 switch 指令。例如:欲根據月份來判斷其季別,可輸入如下:

Example 4: 16-程式流程控制/switch01.mfor month = 1:12 switch month case {3,4,5} season = 'Spring'; case {6,7,8} season = 'Summer'; case {9,10,11} season = 'Autumn'; case {12,1,2} season = 'Winter'; end fprintf('Month %d ===> %s.\n', month, season); end Month 1 ===> Winter. Month 2 ===> Winter. Month 3 ===> Spring. Month 4 ===> Spring. Month 5 ===> Spring. Month 6 ===> Summer. Month 7 ===> Summer. Month 8 ===> Summer. Month 9 ===> Autumn. Month 10 ===> Autumn. Month 11 ===> Autumn. Month 12 ===> Winter.

在上例中,我們省略了 otherwise 敘述。如果 expression 是字串,那麼若要在 case 之後比對多個字串,就必需使用字串的異值陣列(Cell Arrey of Strings),例如:

Example 5: 16-程式流程控制/switch02.mmonth = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Dec', 'Nov', 'Dec'}; for i = 1:length(month) switch month{i} case {'Mar','Apr','May'} season = 'Spring'; case {'Jun','Jul','Aug'} season = 'Summer'; case {'Sep','Oct','Nov'} season = 'Autumn'; case {'Dec','Jan','Feb'} season = 'Winter'; end fprintf('%s is %s.\n', month{i}, season); endJan is Winter. Feb is Winter. Mar is Spring. Apr is Spring. May is Spring. Jun is Summer. Jul is Summer. Aug is Summer. Sep is Autumn. Dec is Winter. Nov is Autumn. Dec is Winter.

Hint
MATLAB 的 switch 指令和 C 語言的 switch 指令略有差別:在 C 語言的 switch 敘述內,每個 case 敘述需加上 break 以跳出該 switch 敘述,而在 MATLAB 則不必多此一舉。

一般而言,switch–case–otherwise 的執行效率優於 if–then–else 。因此,我們應該多多使用 switch–case–otherwise。


MATLAB程式設計:入門篇